#pragma once
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>          
#include<netinet/tcp.h> 
#include<unistd.h>
#include"InetAddress.h"

// 创建一个非阻塞的socket
int createnoblocingfd();


class Socket
{
private:
    // socket持有的文件描述符
    const int fd_;
    // 如果是listenfd，存放的服务端监听的fd。如果是客户端连接的fd，存放的客户端的fd
    std::string ip_;
    // 如果是listenfd，存放的服务端监听的port。如果是客户端连接的fd，存放的外部端口
    uint16_t port_;
public:
    // 传入一个已经准备好的fd
    Socket(int fd);
    // 析构函数,关闭创建的fd_
    ~Socket();
    // 返回 fd_ 成员
    int fd() const;
    // 返回ip成员的值
    std::string ip();
    // 返回port成员的值
    uint16_t port();
    // 设置ip、port等地址信息
    void setaddress(InetAddress& clientaddr);
    // 设置 SO_RESUEADDR 选项，true-打开，false-关闭
    void setreuseaddr(bool on);
    // 设置 SO_NODELAY 选项，true-打开，false-关闭
    void settcpnodelay(bool on);
    // 服务端socket调用此函数绑定端口
    void bind(const InetAddress& servaddr);
    // 服务端socket调用此函数开始监听连接
    void listen(int nn = 128);
    // 服务端socket调用此函数获取客户端连接
    int accept(InetAddress& clientaddr);
};


